@JsonCreator এর মাধ্যমে custom constructors ব্যবহার করা

@JsonCreator এবং @JsonValue - জ্যাকসন অ্যানোটেশন (Jackson Annotations) - Java Technologies

347

Jackson এর @JsonCreator অ্যানোটেশন ব্যবহার করে JSON Deserialization (JSON থেকে Java Object এ রূপান্তর) এর সময় একটি কাস্টম কনস্ট্রাক্টর ব্যবহার করা যায়। এটি বিশেষত তখন উপযোগী যখন একটি ক্লাসে ফিল্ডগুলো ফাইনাল থাকে বা ফিল্ডগুলোকে সরাসরি Constructor এর মাধ্যমে ইনিশিয়ালাইজ করতে হয়।


@JsonCreator এর কাজ

  • @JsonCreator ব্যবহার করে Jackson কে জানানো হয় যে এটি কোন কনস্ট্রাক্টর বা ফ্যাক্টরি মেথড JSON থেকে Java Object তৈরি করার জন্য ব্যবহার করবে।
  • @JsonProperty দিয়ে ফিল্ডগুলোর নাম এবং তাদের ম্যাপিং নির্দিষ্ট করা হয়।

Example: Custom Constructor

Step 1: মডেল ক্লাস তৈরি করা

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    private final String name;
    private final int age;
    private final String email;

    // Custom Constructor
    @JsonCreator
    public User(
        @JsonProperty("name") String name,
        @JsonProperty("age") int age,
        @JsonProperty("email") String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // Getters
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getEmail() {
        return email;
    }
}

Step 2: JSON Deserialization

Sample JSON:
{
  "name": "Alice",
  "age": 30,
  "email": "alice@example.com"
}
Deserialization Code:
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonCreatorExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"}";

        ObjectMapper mapper = new ObjectMapper();

        // JSON থেকে User Object তৈরি
        User user = mapper.readValue(json, User.class);

        // Output
        System.out.println("Name: " + user.getName());
        System.out.println("Age: " + user.getAge());
        System.out.println("Email: " + user.getEmail());
    }
}
Output:
Name: Alice
Age: 30
Email: alice@example.com

Factory Method এর জন্য @JsonCreator

@JsonCreator ফ্যাক্টরি মেথডের সাথেও কাজ করে।

Step 1: মডেল ক্লাস

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    private final String name;
    private final int age;
    private final String email;

    private User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // Factory Method
    @JsonCreator
    public static User createUser(
        @JsonProperty("name") String name,
        @JsonProperty("age") int age,
        @JsonProperty("email") String email) {
        return new User(name, age, email);
    }

    // Getters
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getEmail() {
        return email;
    }
}

Step 2: JSON থেকে Object তৈরি

String json = "{\"name\":\"Bob\",\"age\":25,\"email\":\"bob@example.com\"}";
User user = mapper.readValue(json, User.class);

System.out.println("Name: " + user.getName());
System.out.println("Age: " + user.getAge());
System.out.println("Email: " + user.getEmail());

Field Order Independent Mapping

@JsonCreator ফিল্ডের অর্ডার-ইনডিপেনডেন্ট ম্যাপিং নিশ্চিত করে।

JSON:

{
  "age": 40,
  "email": "john@example.com",
  "name": "John"
}

Deserialization Code:

User user = mapper.readValue(json, User.class);

System.out.println("Name: " + user.getName());
System.out.println("Age: " + user.getAge());
System.out.println("Email: " + user.getEmail());
Output:
Name: John
Age: 40
Email: john@example.com

নেস্টেড অবজেক্ট সহ @JsonCreator

Step 1: Address Class

public class Address {
    private final String city;
    private final String zip;

    @JsonCreator
    public Address(
        @JsonProperty("city") String city,
        @JsonProperty("zip") String zip) {
        this.city = city;
        this.zip = zip;
    }

    public String getCity() {
        return city;
    }

    public String getZip() {
        return zip;
    }
}

Step 2: User Class

public class User {
    private final String name;
    private final Address address;

    @JsonCreator
    public User(
        @JsonProperty("name") String name,
        @JsonProperty("address") Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }
}

Step 3: JSON Input

{
  "name": "Alice",
  "address": {
    "city": "New York",
    "zip": "10001"
  }
}

Step 4: Deserialization

String json = "{\"name\":\"Alice\",\"address\":{\"city\":\"New York\",\"zip\":\"10001\"}}";

User user = mapper.readValue(json, User.class);

System.out.println("Name: " + user.getName());
System.out.println("City: " + user.getAddress().getCity());
System.out.println("Zip: " + user.getAddress().getZip());
Output:
Name: Alice
City: New York
Zip: 10001

  • @JsonCreator JSON থেকে Object তৈরি করার জন্য কাস্টম Constructor বা Factory Method নির্দিষ্ট করতে ব্যবহার করা হয়।
  • @JsonProperty দিয়ে ফিল্ডের নাম এবং JSON এর সাথে তাদের ম্যাপিং নিশ্চিত করা হয়।
  • এটি বিশেষভাবে কার্যকর যখন ফিল্ডগুলো ফাইনাল থাকে বা ক্লাস Immutable হয়।
  • @JsonCreator ফিল্ড অর্ডার ইনডিপেনডেন্ট এবং নেস্টেড JSON এর সাথেও কাজ করে।
Content added By
Promotion

Are you sure to start over?

Loading...